TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1// Embranchement : duplique la conversation jusqu'à un message donné.2import { NextResponse } from "next/server";3import { z } from "zod";4import { apiError, parseBody } from "@/lib/api.ts";5import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts";6import { all, get, run, transaction } from "@/lib/db/index.ts";78const schema = z.object({ upToMessageId: z.number().int().positive() });910export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }) {11 try {12 await assertSameOrigin();13 const user = await requireUser();14 const id = parseInt((await ctx.params).id, 10);15 const conv = get<{ id: number; title: string; course_code: string | null; mode: string; knowledge_mode: string; model: string }>(16 "SELECT id, title, course_code, mode, knowledge_mode, model FROM conversations WHERE id = ? AND user_id = ?",17 id, user.id18 );19 if (!conv) return NextResponse.json({ error: "Conversation introuvable." }, { status: 404 });20 const { upToMessageId } = await parseBody(req, schema);2122 const newId = transaction(() => {23 const r = run(24 `INSERT INTO conversations (user_id, course_code, title, mode, knowledge_mode, model, parent_conversation_id, branched_from_message_id)25 VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,26 user.id, conv.course_code, conv.title + " (branche)", conv.mode, conv.knowledge_mode, conv.model, conv.id, upToMessageId27 );28 const nid = Number(r.lastInsertRowid);29 const msgs = all<{ role: string; content: string; citations: string; attachments: string; model: string; mode: string; knowledge_mode: string }>(30 "SELECT role, content, citations, attachments, model, mode, knowledge_mode FROM messages WHERE conversation_id = ? AND id <= ? ORDER BY id",31 conv.id, upToMessageId32 );33 for (const m of msgs) {34 run(35 "INSERT INTO messages (conversation_id, role, content, citations, attachments, model, mode, knowledge_mode) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",36 nid, m.role, m.content, m.citations, m.attachments, m.model, m.mode, m.knowledge_mode37 );38 }39 return nid;40 });41 return NextResponse.json({ ok: true, conversationId: newId });42 } catch (e) {43 return apiError(e);44 }45}46